package xianchenglock;

import java.util.concurrent.TimeUnit;

/**
 * @功能
 * @创建时间 2019/12/18
 * 锁定对象o，如果o的属性发生改变，不影响锁的使用
 * 但如果o变成另外一个对象，则锁定的对象发生改变
 * 应该避免锁定对象的引用变成另外的对象
 */
public class D {
    Object o = new Object();
    void m(){
        synchronized (o){
            while (true){
                try {
                    TimeUnit.SECONDS.sleep(1);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.println(Thread.currentThread().getName());
            }
        }
    }

    public static void main(String[] args) {
        D t = new D();
        // 启动第一个线程
        new Thread(t::m,"t1").start();
        try {
            TimeUnit.SECONDS.sleep(3);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        // 启动第二个线程
        Thread t2 = new Thread(t::m,"t2");
        t.o = new Object();  //注释掉t2线程则不会执行
        t2.start();
    }
}
